package com.endesa.arqame4j.parqweb.dao;

import java.io.File;
import java.io.IOException;
import java.util.Properties;

import javax.naming.NamingException;
import javax.sql.DataSource;

import org.dbunit.DataSourceBasedDBTestCase;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.endesa.arqame4j.parqweb.exception.GeneralException;

/**
 * Clase padre para la ejecucion de pruebas unitarias de la BBDD por medio de
 * DBUnit.
 * @author Ignacio Lopez, Enrique Diaz, Jose Luis Gutierrez
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext-dao.xml" })
public class CargadorJunit extends DataSourceBasedDBTestCase {

   /** Propiedades del datasource */
   private Properties propiedades;

   /**
    * Constructor default.
    */
   public CargadorJunit() {
      SimpleNamingContextBuilder builder;
      DataSource ds;

      propiedades = new Properties();

      try {
         propiedades.load(Thread.currentThread().getContextClassLoader()
                  .getResourceAsStream("baseDatos.properties"));
      } catch (IOException ex) {
         throw new GeneralException(
                  "Error en la carga de propiedades de la BBDD "
                           + "para las pruebas unitarias", ex);
      }

      try {
         builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
         ds = getDataSource();
         builder.bind(propiedades.getProperty("datasource.name"), ds);
      } catch (NamingException ex) {
         throw new GeneralException("Error en el binding del datasource", ex);
      }
   }

   /**
    * Obtiene el datasource para la BBDD.
    * @return DataSource con el que se conectara a la BBDD
    * @see org.dbunit.DataSourceBasedDBTestCase#getDataSource()
    */
   @Override
   protected DataSource getDataSource() {
      DriverManagerDataSource ds; // Datasource

      ds = new DriverManagerDataSource();
      ds.setDriverClassName(propiedades.getProperty("datasource.controlador"));
      ds.setUrl(propiedades.getProperty("datasource.url"));
      ds.setUsername(propiedades.getProperty("datasource.clave"));
      ds.setPassword(propiedades.getProperty("datasource.credencial"));

      return ds;
   }

   /**
    * Obtiene el dataset con el que se populara la BBDD.
    * @return Dataset con el que la informacion que se cargara en la BBDD
    * @see org.dbunit.DatabaseTestCase#getDataSet()
    */
   @Override
   protected IDataSet getDataSet() throws Exception {
      return new FlatXmlDataSet(new File("setup/dbexport.xml"));
   }

   /**
    * Operacion de inicializacion que se realizara con el dataset.
    * @return Operacion que se realizara
    * @see org.dbunit.DatabaseTestCase#getSetUpOperation()
    */
   @Override
   protected DatabaseOperation getSetUpOperation() throws Exception {
      return DatabaseOperation.REFRESH;
   }

   /**
    * Operacion de finalizacion que se realizara con el dataset.
    * @return Operacion que se realizara
    * @see org.dbunit.DatabaseTestCase#getTearDownOperation()
    */
   @Override
   protected DatabaseOperation getTearDownOperation() throws Exception {
      return DatabaseOperation.DELETE;
   }

   /**
    * Inicializacion de los recursos para la prueba
    * @see org.dbunit.DatabaseTestCase#setUp()
    */
   @Override
   @Before
   public void setUp() throws Exception {
      super.setUp();
   }

   /**
    * Liberacion de los recursos de la prueba
    * @see org.dbunit.DatabaseTestCase#tearDown()
    */
   @Override
   @After
   public void tearDown() throws Exception {
      super.tearDown();
   }
}
